package jm.nj.demo16main.annotation;

import org.junit.Test;

import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.Arrays;

/*
* 注解的解析:使用反射技术获取注解中属性的值
 * 目标:@MyAnnotation3注解属性value的值{"aaa","bbb","ccc"}
 *
 * 反射包中描述接口
 *  java.lang..reflect.AnnotationElement
 * AnnotationElement接口实实现类
 * AccessibleObject,Class,Constructor,Field,Method,Package
 *
 * AnnotatedElement接口中的抽象方法
 *   boonlean isAnnotationPresent(Class<? extends Annotation>annotationClass)判断指定的注释是否存在
 * 方法中传递指定注解class文件对象,判断当前的类型上是否存在传递的参数的注解,存在则返回 true，不存在返回 false。
 * 参数传递MyAnnotation3.class,哪个类型调用了isAnnotationPresent就判断哪个类型上是否有此注解
 *
 *T  getAnnotation(class<T> annotationClass)获取指定的注释,参数传递的是谁,返回值就返回谁
 * 如果传递参数存在于指定的类型上,则返回该注解,如果不存在,则返回null
 * 	注意:以上提到的类型包含(AccessibleObject, Class, Constructor, Field, Method, Package)
 *
 * 操作步骤:
 * 1.获取本类UseAnnotation2的class文件对象
 * 2.使用反射技术获取本类中的所有方法
 * 3.使用isAnnotationPresent方法判断方法上是否包含MyAnnotation3这个注解
 * 4.如果方法上包含了MyAnnotation3这个注解使用getAnnotation方法获取该注解
 * 5.使用注解的属性名获取注解的属性值
 *
 * Method累的中的方法
 * String getName() 以String 形式返回此Method对象的方法名
 *
 *
* */
public class UseAnnotation2 {
    @MyAnnotation3(value1= {"aaa","bbb","ccc"})
    public void method(){
        System.out.println("method方法");
    }

    @Test
    public void demo(){
        //1.获取本类UseAnnotation2的class文件对象
        Class clazz = UseAnnotation2.class;
        //2.使用反射获取方法(所有)
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            //3.使用isAnnotationPresent方法判断方法上是否包含MyAnnotation3 这个注解
            boolean b = method.isAnnotationPresent(MyAnnotation3.class);
           // System.out.println(b+"---"+method);//true---public void jm.nj.demo16main.annotation.UseAnnotation2.method()
            if(b){
                //getAnnotation方法获取注释
                MyAnnotation3 myAnn3 = method.getAnnotation(MyAnnotation3.class);

                //5.使用注解的属性名获取注解的属性值
                String[] arr = myAnn3.value1();
                System.out.println(Arrays.toString(arr));
            }

        }
    }

}
